home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Network Support Library
/
RoseWare - Network Support Library.iso
/
apidev
/
vap.arc
/
SAP.C
< prev
next >
Wrap
C/C++ Source or Header
|
1988-04-28
|
5KB
|
152 lines
/*****************************************************************************
*
* Program Name: SAMPLE.VAP
*
* Filename: sap.c
*
* Version: 1.0
*
* Programmers: Bryan Sparks
*
* Files used: comm.h
*
* Comments: This is a "plug-in" sap module to do service advertising.
*
****************************************************************************/
#include "comm.h"
/* We will keep this pointer around so as to keep track of the */
/* oscillating ECB. We will need to know where it is later so we */
/* can cancel the event associated with that ECB. */
ECB *DownECBPointer;
void SAPWaitESRHandler();
void SAPAdvertiseESRHandler();
SAPData SAPDataEntity;
ECB SAPECB;
IPXPacket SAPPacket;
void StartSAPOscillationRoutines( ServerName, ServerType, ServerSocket )
char ServerName[48];
int ServerType;
unsigned int ServerSocket;
{
/* Initialize the variables for the SAP IPXPacket. */
/* Notice that I broadcast on socket 452h (The SAP Socket) */
/* You need not have the socket open to send on the socket. */
SAPPacket.PacketType = (unsigned char)4;
SAPPacket.PacketLength = IntSwap( sizeof( IPXPacket ) );
IPXGetInternetworkAddress( (unsigned char *)SAPPacket.Destination.Network );
memset( SAPPacket.Destination.Node, 0xFF, 6 );
SAPPacket.Destination.Socket = 0x5204;
/* I initialize the SAP data packet. See the SAP document for details. */
SAPDataEntity.InfoType = IntSwap( 2 );
SAPDataEntity.ServerType = IntSwap( ServerType );
strcpy( SAPDataEntity.ServerName, ServerName);
IPXGetInternetworkAddress( (unsigned char *)SAPDataEntity.Address.Network );
SAPDataEntity.IntermediateNetworks = IntSwap( 1 );
SAPDataEntity.Address.Socket = ServerSocket;
/* Initialize the ECB. */
SAPECB.ESRAddress = (char far *)SAPWaitESRHandler;
SAPECB.InUseFlag = 0;
SAPECB.FragmentCount = 2;
SAPECB.ECBSocket = 0x5204;
memset( SAPECB.ImmediateAddress, 0xFF, 6 );
SAPECB.FragmentDescriptor[0].Address = (char far *)&SAPPacket;
SAPECB.FragmentDescriptor[0].Size = sizeof (IPXPacket );
SAPECB.FragmentDescriptor[1].Address = (char far *)&SAPDataEntity;
SAPECB.FragmentDescriptor[1].Size = sizeof( SAPData );
IPXSendPacket( &SAPECB );
}
/* These two ESRs require some explanation. */
/* When the IPXSendPacket is done above the ESR SAPWaitESR will be called */
/* This ESR will immediately change the ESR to SAPAdvertiseESR and waits */
/* one minute. In one minute the SAPAdvertiseESR will be activated and */
/* it will change the ESR to SAPWaitESR and then do a send packet. */
/* These two ESRs will oscillate back and forth thus doing SAP calls. */
void SAPWaitESR( wECB )
ECB *wECB;
{
wECB->ESRAddress = (char far *)SAPAdvertiseESRHandler;
IPXScheduleIPXEvent( 60*18, wECB ); /* Every 60 Seconds */
}
void SAPAdvertiseESR( wECB )
ECB *wECB;
{
wECB->ESRAddress = (char far *)SAPWaitESRHandler;
IPXSendPacket( wECB );
}
int StopSAPOscillationRoutines( ServerName, ServerType, ServerSocket )
char ServerName[48];
int ServerType;
unsigned int ServerSocket;
{
SAPData wDataEntity;
ECB wECB;
IPXPacket wPacket;
/* First we will cancel the SAP oscillation ESRs. */
IPXCancelEvent( &SAPECB );
while (SAPECB.InUseFlag)
;
/* Was the event canceled? FC means yes. */
if (SAPECB.CompletionCode != 0xFC)
return (-1);
/* Now we will send out a IPX packet telling everyone that this */
/* server is down. See the SAP document for details. */
wPacket.PacketType = (unsigned char)4;
wPacket.PacketLength = IntSwap( sizeof( IPXPacket ) );
IPXGetInternetworkAddress( (unsigned char *)wPacket.Destination.Network );
memset( wPacket.Destination.Node, 0xFF, 6 );
wPacket.Destination.Socket = 0x5204;
/* I initialize the SAP data packet. See the SAP document for details. */
/* Tell everyone that I am going down. (Thus the 16 intermediate networks) */
wDataEntity.InfoType = IntSwap( 2 );
wDataEntity.ServerType = IntSwap( ServerType );
strcpy( wDataEntity.ServerName, ServerName);
IPXGetInternetworkAddress( (unsigned char *)wDataEntity.Address.Network );
wDataEntity.IntermediateNetworks = IntSwap( 16 );
wDataEntity.Address.Socket = ServerSocket;
/* Initialize the ECB. */
wECB.FragmentCount = 2;
wECB.ECBSocket = 0x5204;
memset( wECB.ImmediateAddress, 0xFF, 6 );
wECB.FragmentDescriptor[0].Address = (char far *)&wPacket;
wECB.FragmentDescriptor[0].Size = sizeof (IPXPacket );
wECB.FragmentDescriptor[1].Address = (char far *)&wDataEntity;
wECB.FragmentDescriptor[1].Size = sizeof( SAPData );
IPXSendPacket( &wECB );
while( wECB.InUseFlag )
;
return (0);
}